/**************************************************************************/ /**
 * @file     ui_event.c
 * @brief    UI 事件回调函数
 * @version  V2.0
 * @date     2022.03.15
******************************************************************************/
#include "ui_event.h"

/**
 * @brief 	清理首页的视频
 * @param 	\
 * @retval	\
 * @note 	\
 */
static void auto_clean_home_video(void)
{
    uint32_t video_loop_time = 0, video_loop_max = 0;
    mv_task_get_loop(&video_loop_time, &video_loop_max);
    if (1 == video_loop_max) //仅 首页 置为 1
    {
        mv_task_set_loop(0, 0xFFFFFFFF); // uint32_t 有效范围
        mv_task_over();
    }
}

/**
 * @brief 	查表导航跳转至对应界面
 * @param 	obj 		- 目标对象
 *			table		- 源表
 *			table_size  - 表大小
 * @retval	\
 * @note 	\
 */
static void page_jump(lv_obj_t *obj, user_page_t *table, uint16_t table_size)
{
    uint16_t list_size = table_size;
    uint16_t index = 0;
    for (index = 0; index < list_size && table[index].obj != Page_Obj_Cur; ++index) //遍历页面
        ;
    if (index >= list_size) //页面索引无效
        return;

    uint16_t page_index = index; //页面索引有效
    list_size = table[page_index].widget_size;
    for (index = 0; index < list_size && table[page_index].widget[index].obj != obj; ++index) //遍历页面内节点
        ;
    if (index >= list_size) //页面内节点无效
        return;

    Page_Obj_Index = index; //页面内节点有效
	
	
	if (page_index != PP || index < 2)
	{
		char file_path[FF_MAX_LFN];
		strcpy(file_path, VolumeStr[SPI]);
		strcat(file_path, File_Table.file[FLASH_MUSIC_ICON].name);
		mv_task_init(file_path); //单击音效
	}
	
    switch (page_index)
    {
    case (HOME):
        //自动清理首页视频
        auto_clean_home_video();
        break; // continue

    case (M0):
        break; // continue

    case (M4):
        break; // continue

    case (PD):
		delete_gif(&GIF); //清理GIF组件
        break; // continue

    case (PP):
		if (index < 2)//return / back
		{
			delete_gif(&GIF); //清理GIF组件
			clean_pp_quit();
		}
        break; // continue

    case (GIF_M0):
		delete_gif(&GIF); //清理GIF组件
        break; // continue

    case (GIF_M4):
		delete_gif(&GIF); //清理GIF组件
        break; // continue

    default:
        break;
    }

    if (NULL != table[page_index].widget[index].user_cb)
        Page_Obj_Cur = table[page_index].widget[index].user_cb(table[page_index].obj, &Page_Obj_Index); //执行用户回调-切换页面
}

/*======================================== 事件回调函数定义 =====================================*/
/**
 * @brief 	各页面 widget 回调
 * @param 	obj 	- 触发事件的对象
 * 			event 	- 事件类型
 * @retval 	\
 * @note    \
 */
void event_cb_widget(lv_obj_t *obj, lv_event_t event)
{
    if (event == LV_EVENT_RELEASED) //任何情况下对象释放了就触发
    {
        page_jump(obj, Page_Table, PAGE_SIZE);
    }
}

/**
 * @brief   首页的视频按钮回调
 * @param 	obj		-触发事件的对象
 *          event	-事件类型
 * @retval	\
 * @note 	\
 */
void event_cb_home_video(lv_obj_t *obj, lv_event_t event)
{
    if (event == LV_EVENT_CLICKED) //点击对象, 如果不拖动则在释放时调用（无论是否长按）
    {
        auto_clean_home_video();
    }
}

/**
 * @brief 	tabview 页面 点击/滑动 回调
 * @param 	obj 	- 触发事件的对象
 * 			event 	- 事件类型
 * @retval 	\
 * @note    \
 */
void event_cb_tabview(lv_obj_t *obj, lv_event_t event)
{
    if (event == LV_EVENT_VALUE_CHANGED) //在通过滑动或单击选项卡按钮选择新选项卡时发送
    {
        uint16_t page_index = lv_tabview_get_tab_act(TabView); //获取活跃页面的索引
        if (page_index > PP)                                   //滑动页面无效
            return;

        Page_Obj_Index = page_index; //页面有效
		
		delete_gif(&GIF);        //清理GIF组件

		char file_path[FF_MAX_LFN];
		strcpy(file_path, VolumeStr[SPI]);
		strcat(file_path, File_Table.file[FLASH_MUSIC_SLIDE].name);//滑动音效
		mv_task_init(file_path);
		
        switch (page_index)
        {
        case (HOME):
		break;//continue
		
        case (M0):
			auto_clean_home_video(); //自动清理首页视频
        break;//continue
		
        case (M4):
        break;//continue
		
        case (PD):
			clean_pp_quit();
            Page_Obj_Cur = page_jump_pd(Page_Table[page_index].obj, &Page_Obj_Index);
            break;//continue

        case (PP):
            Page_Obj_Cur = page_jump_pp(Page_Table[page_index].obj, &Page_Obj_Index);
            break;
		
        default:break;
        }	
        // TAB 跳转
        lv_tabview_set_tab_act(TabView, page_index, LV_ANIM_OFF);
        //光标切换
        Page_Obj_Cur = Page_Table[page_index].obj;
    }
}

/**
 * @brief   TabView 各页面拖拽回调
 * @param 	obj		-触发事件的对象
 *			event	-事件类型
 * @retval	None
 * @note
 */
void event_cb_page_slide(lv_obj_t *obj, lv_event_t event)
{
    switch (event)
    {
    case (LV_EVENT_DRAG_BEGIN): //对象的拖动已经开始
    {
        // LOG_INFO("Page Drag Begin\r\n");
        mv_task_pause();
        break;
    }
    case (LV_EVENT_RELEASED): //对象已被释放
    {
        // LOG_INFO("Page Press Released\r\n");
        mv_task_resume();
        break;
    }
    }
}

/**
 * @brief   M0 / M4 GIF 页开关回调(全屏跟随触摸)
 * @param 	obj		- 触发事件的对象
 *          event	- 事件类型
 * @retval	\
 * @note
 */
void event_cb_video_switch(lv_obj_t *obj, lv_event_t event)
{
    if (event == LV_EVENT_VALUE_CHANGED)
    {
        Video_Touch_Flag = (lv_switch_get_state(obj)) ? true : false;
        if (!Video_Touch_Flag) //回到中间，避免视觉上遮挡按钮
            lcd_set_post(LAYER_2_VIDEO,
                         GET_OFFSET_X(LV_HOR_RES_MAX, FLASH_VIDEO_AREA_W, 1),
                         GET_OFFSET_Y(LV_VER_RES_MAX, FLASH_VIDEO_AREA_H, 1), 0, 0);
    }
}

/**
 * @brief   M0 / M4 GIF 页滑块回调(视频图层透明度调节)
 * @param 	obj		- 触发事件的对象
 *          event	- 事件类型
 * @retval	\
 * @note
 */
void event_cb_video_slider(lv_obj_t *obj, lv_event_t event)
{
    if (event == LV_EVENT_VALUE_CHANGED) //滑块值被改变
    {
        lcd_set_alpha(LAYER_2_VIDEO, 0xFF * lv_slider_get_value(obj) / 100);
    }
}

/**
 * @brief   Picture 页视频操作按钮回调 - 左
 * @param 	obj		- 触发事件的对象
 *          event	- 事件类型
 * @retval	\
 * @note
 */
void event_cb_video_btn_left(lv_obj_t *obj, lv_event_t event)
{
    if (event == LV_EVENT_CLICKED) //点击对象, 如果不拖动则在释放时调用（无论是否长按）
    {
        lcd_set_post(LAYER_2_VIDEO, 0, GET_OFFSET_Y(LV_VER_RES_MAX, FLASH_VIDEO_AREA_H, 1), 0, 0);
    }
}

/**
 * @brief   Picture 页视频操作按钮回调 - 右
 * @param 	obj		- 触发事件的对象
 *          event	- 事件类型
 * @retval	\
 * @note
 */
void event_cb_video_btn_right(lv_obj_t *obj, lv_event_t event)
{
    if (event == LV_EVENT_CLICKED) //点击对象, 如果不拖动则在释放时调用（无论是否长按）
    {
        lcd_set_post(LAYER_2_VIDEO, LV_HOR_RES_MAX - FLASH_VIDEO_AREA_W, GET_OFFSET_Y(LV_VER_RES_MAX, FLASH_VIDEO_AREA_H, 1), 0, 0);
    }
}
